package com.whpost.service.tools;

import jakarta.servlet.http.HttpServletResponse;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.apache.commons.codec.binary.Base64;


import javax.imageio.ImageIO;
import java.io.*;
import java.util.UUID;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author: Yin Zhuoyi
 * @Date: 2021/12/24 14:15
 */
public class FileUtil {

    public static void download(String filename, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        OutputStream outputStream = res.getOutputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        // 读取filename
        bis = new BufferedInputStream(new FileInputStream(new File("./file/" + filename)));
        int i = bis.read(buff);
        while (i != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            i = bis.read(buff);
        }
    }

    /**
     *
     * @author madaha
     *
     * @param path 上传路径
     * @param imgDate base64图片
     * @return
     * @throws IOException
     */
    public static String base64ToImgTransformation(String path, String imgDate) throws Exception {
        //随机生成图片名
        String imgid= UUID.randomUUID().toString().replaceAll("-", "");
        //用于拼接图片名称+后缀格式
        String str = "";
        //获取图片后缀名

        try {
            String dataPrix = "";
            //String data = "";
            String [] d = imgDate.split("base64,");
            if(d != null && d.length == 2){
                dataPrix = d[0];
                // data = d[1];
            }else{
                throw new Exception("上传失败，数据不合法");
            }

            //前台在用Ajax传base64值的时候会把base64中的+换成空格，所以需要替换回来。
            imgDate = imgDate.replaceAll(" ", "+");
            //图片后缀
            String suffix = "";
            if("data:image/jpeg;".equalsIgnoreCase(dataPrix)){//编码的jpeg图片数据
                suffix = ".jpeg";
                //去除base64中无用的部分，上传相应的图片的是去掉对应的即可
                imgDate = imgDate.replaceAll("data:image/jpeg;base64,", "");
            } else if("data:image/jpg;".equalsIgnoreCase(dataPrix)){//编码的gif图片数据
                suffix = ".jpg";
                imgDate = imgDate.replaceAll("data:image/jpg;base64,", "");
            } else if("data:image/png;".equalsIgnoreCase(dataPrix)){//编码的png图片数据
                suffix = ".png";
                imgDate = imgDate.replaceAll("data:image/png;base64,", "");
            }else {
                throw new Exception("上传图片格式不合法");
            }

            // 生成文件名
		    /*String files = new SimpleDateFormat("yyyyMMddHHmmssSSS")
				.format(new Date())
				+ (new Random().nextInt(9000) % (9000 - 1000 + 1) + 1000);*/

            //base64图片解码
            byte[] byteimgDate = Base64.decodeBase64(imgDate);

            for (int i = 0; i < byteimgDate.length; ++i) {
                // 调整异常数据
                if (byteimgDate[i] < 0) {
                    byteimgDate[i] += 256;
                }
            }

            //图片名
            str = imgid + suffix;

            //上传图片路径
            String filename = path;

            File file = new File(filename);
            file.createNewFile();

            if (!file.exists()) {
                file.createNewFile();
            }

            OutputStream out = new FileOutputStream(file);
            out.write(byteimgDate);
            out.flush();
            out.close();
        } catch (Exception e) {
            // TODO: handle exception
            //e.printStackTrace();
            throw new Exception("图片上传发生错误！"+e.toString());
        }
        return str;
    }

    /**
     *
     * @param lj  用户上传图片
     * @param lj1 模板路径
     * @param lj2 合成图片路径
     * @throws IOException
     */
    public  static void hctp(String lj,String lj1,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(1000, 1500)  //处理图片大小
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(lj1)), 1.0f)  //添加水印 参数分别为（水印位置，水印图片的路径，透明度）
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }

    public  static void hctp_zst(String lj,String lj1,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(90, 130)  //处理图片大小
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(lj1)), 1.0f)  //添加水印 参数分别为（水印位置，水印图片的路径，透明度）
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }


    /**
     *
     * @param lj  用户上传图片
     * @param lj1 模板路径
     * @param lj2 合成图片路径
     * @throws IOException
     */
    public  static void hctp_gxhzs(String lj,String lj1,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(2953, 2362)  //处理图片大小
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(lj1)), 1.0f)  //添加水印 参数分别为（水印位置，水印图片的路径，透明度）
                .outputQuality(0.3f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }


    /**
     *
     * @param lj  用户上传图片
     * @param lj1 模板路径
     * @param lj2 合成图片路径
     * @throws IOException
     */
    public  static void hctp1(String lj,String lj1,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(1500, 1000)  //处理图片大小
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(lj1)), 1.0f)  //添加水印 参数分别为（水印位置，水印图片的路径，透明度）
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }

    public  static void hctp1_zst(String lj,String lj1,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(199, 133)  //处理图片大小
                .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(lj1)), 1.0f)  //添加水印 参数分别为（水印位置，水印图片的路径，透明度）
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }



    /**
     *
     * @param lj  用户上传图片
     * @param lj2 合成图片路径
     * @throws IOException
     */
    public  static void wbj_hctp(String lj,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(1000, 1500)  //处理图片大小
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }

    public  static void wbj_hctp1(String lj,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(1500, 1000)  //处理图片大小
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }

    public  static void wbj_hctp_zst(String lj,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(90, 135)  //处理图片大小
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }

    public  static void wbj_hctp1_zst(String lj,String lj2) throws IOException {

        Thumbnails.of(new File(lj))
                .size(199, 133)  //处理图片大小
                .outputQuality(1.0f)  //压缩比例
                .toFile(lj2);  //生成的图片的位置
    }



    public static void main(String[] args) throws IOException {
        //hctp();
    }

}
